Создадим файл MainWindow.vala
using GLib;
using Gtk;
public class HyprCalendar.MainWindow : Gtk.ApplicationWindow {
public MainWindow(Gtk.Application parent){
GLib.Object(application:parent);
set_name("main_window");
create_ui();
}
private void create_ui() {
var calendar = new Gtk.Calendar();
set_child(calendar);
}
}
создадим файл Application.vala
using GLib;
using Gtk;
using GtkLayerShell;
public class HyprCalendar.Application: Gtk.Application {
public Application() {
Object(application_id: "com.github.HyprCalendar");
}
public override void activate() {
var window = new MainWindow(this);
GtkLayerShell.init_for_window(window);
GtkLayerShell.set_layer(window, GtkLayerShell.Layer.TOP);
GtkLayerShell.set_namespace(window, "HyprCalendar");
GtkLayerShell.set_anchor(
window,
GtkLayerShell.Edge.TOP,
true
);
window.present();
}
public static int main() {
var application = new HyprCalendar.Application();
return application.run();
}
}
инициализируем проект
cd HyprCalendarWidget
meson setup build
в папке проекта появится папка build. Соберём проект
ninja -C build
запустим проект
./build/hypr_calendar_widget
после запуска по верх открытых приложений появится окно

Чтобы закрыть его, нажмите сочетание клавиш Ctrl + C в консоли
Разбор Application.vala
Библиотека Gtk требует чтобы у каждого приложения был application id
public Application() {
Object(application_id: "com.github.HyprCalendar");
}
activate вызывается при запуске приложения или повторном открытии уже запущенного экземпляра
public override void activate()
В переменной window хранится наше окно описанное в файле MainWindow.vala
var window = new MainWindow(this);
Для того чтобы взаимодействовать с протоколом LayerShell нужно передать библиотеке gtk4-layer-shell созданное окно.
GtkLayerShell.init_for_window(window);
Для того чтобы окно располагалось по верх всех открытых приложений, его нужно открывать на верхнем слое. Подробнее о слоях
GtkLayerShell.set_layer(window, GtkLayerShell.Layer.TOP);
Имя пространства нужно для удобства, используя это имя можно в конфиге Hyprland настроить блюр, анимации и другие украшательства.
GtkLayerShell.set_namespace(window, "HyprCalendar");
Здесь задан верхний якорь для окна. Если включить все 4 якоря, то окно растянется на весь монитор.
GtkLayerShell.set_anchor(
window,
GtkLayerShell.Edge.TOP,
true
);
window.present(); показывает окно
Точка входа программы
public static int main() {
var application = new HyprCalendar.Application();
return application.run();
}